package com.my.jli.Service;

import com.my.jli.entity.*;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

/**
 * @ClassName ExerciseService
 * @Description
 * @Author MaYu
 * @Date 2022/4/11 19:16
 * @Version 1.0
 **/
public interface ExerciseService {
    /**
     * 获取所有练习与选项的map
     * @return 所有练习与选项的map
     */
    Map<Exercise, ExerciseOption> findAll();

    /**
     * 分页获取所有习题
     * @param pageable pageable
     * @return 分页的习题
     */
    Page<Exercise> findAll(Pageable pageable);

    /**
     * 带分页和查询
     * @param example example
     * @param pageable pageable
     * @return 习题列表
     */
    Page<Exercise> findAll(Example<Exercise> example, Pageable pageable);

    /**
     * 通过id获取习题信息
     * @param id id
     * @return exercise
     */
    Exercise findExerciseById(Integer id);

    /**
     * 通过习题id获取选项
     * @param eid 习题id
     * @return 选项
     */
    ExerciseOption findOptionByEid(Integer eid);

    /**
     * 获取所有习题类型
     * @return 习题类型
     */
    List<ExerciseType> findAllType();

    /**
     * 获得所有习题章节
     * @return 章节列表
     */
    List<ExerciseChapter> findAllChapter();

    /**
     * 添加习题
     * @param exercise exercise
     * @return 添加的习题id
     */
    Integer saveExercise(Exercise exercise);

    void saveExercise(Exercise exercise, ExerciseOption option);

    /**
     * 添加选项
     * @param option option
     */
    void saveExerciseOption(ExerciseOption option);

    /**
     * 添加章节
     * @param chapter chapter
     */
    void saveExerciseChapter(ExerciseChapter chapter);

    /**
     * 通过名称获取章节信息
     * @param chapterName 章节名称
     * @return 章节信息
     */
    ExerciseChapter findChapterByName(String chapterName);

    /**
     * 根据名称获取类型
     * @param typeName 类型名称
     * @return ExerciseType
     */
    ExerciseType findTypeByName(String typeName);

    /**
     * 根据id删除习题信息
     * @param id 习题id
     */
    void deleteExerciseById(Integer id);

    /**
     * 获取章节完成度
     * @param cId 章节id
     * @param sId 学生id
     * @return 完成度
     */
    double getCompletionRate(Integer cId, Integer sId);

    List<Exercise> getExerciseByCid(Integer cId);

    /**
     * 保存学生答题情况
     */
    ExerciseAndStudent saveExerciseAndStudent(ExerciseAndStudent es);

    /**
     * 获取学生做题记录
     * @param eid 习题id
     * @param sid 学生id
     * @return 记录
     */
    ExerciseAndStudent findESByEidAndSid(Integer eid, Integer sid);
}
